﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Util;
using SiGeCoPre.Presupuesto_ViewGeneral;

namespace SiGeCoPre.Presupuesto_ViewModificacion
{
    /// <summary>
    /// Formulario para modificar presupuestos de mantenimiento
    /// </summary>
    public partial class frmModificarPresupuestoMantenimiento : Form
    {
        int idPresupuesto = 0;
        String[] datosProForma = null;
        String formaPago = "";
        String condicionesGenerales = "";
        String ejecucionTrabajo = "";
        int idCliente = 0;
        List<string> tareas = null;
        List<string> tareasAnteriores = null;
        bool esProForma = false;
        String plazoEntrega = "";
        String tipo = "Mantenimiento";
        String rutaVieja = "";

        BLPresupuestos createPresupuesto = BLFactoryPresupuesto.createPresupuesto();
        BLPresupuestosClientes createPresupuestoCliente = BLFactoryPresupuesto.createPresupuestoClientes();
        BLClientes createCliente = BLFactoryPresupuesto.createCliente();
        BLPresupuestoMantenimiento createPresupuestoMantenimiento = BLFactoryPresupuesto.createPresupuestoMantenimiento();
        BLMantenimiento createMantenimiento = BLFactoryPresupuesto.createMantenimiento();

        public frmModificarPresupuestoMantenimiento()
        {
            InitializeComponent();
        }

        private void frmAltaPresupuestoMantenimiento_Load(object sender, EventArgs e)
        {
            cmbEstado.Text = "Pendiente";
            String[] estados = { "Pendiente", "Aprobado" };
            cmbEstado.Items.AddRange(estados);
        }

        private void rdProForma_CheckedChanged(object sender, EventArgs e)
        {
            if (rdProForma.Checked)
            {
                btnProForma.Visible = true;
            }
            else
            {
                btnProForma.Visible = false;
            }
        }

        private void btnProForma_Click(object sender, EventArgs e)
        {
            frmProForma proforma = new frmProForma();
            proforma.cargarValores(datosProForma);
            proforma.FormClosed += new FormClosedEventHandler(proforma_FormClosed);
            proforma.Show();
        }

        private void proforma_FormClosed(object sender, FormClosedEventArgs e)
        {
            datosProForma = frmProForma.pasarValores();
            if (null != datosProForma)
            {
                esProForma = true;
            }
        }

        private void btnCondiciones_Click(object sender, EventArgs e)
        {
            frmDetalles condiciones = new frmDetalles();
            condiciones.cargarDetalle(condicionesGenerales);
            condiciones.FormClosed += new FormClosedEventHandler(condiciones_FormClosed);
            condiciones.Show();
        }

        private void condiciones_FormClosed(object sender, FormClosedEventArgs e)
        {
            condicionesGenerales = frmDetalles.pasarDetalle();
        }

        private void btnEjecucion_Click(object sender, EventArgs e)
        {
            frmDetalles ejecucion = new frmDetalles();
            ejecucion.cargarDetalle(ejecucionTrabajo);
            ejecucion.FormClosed += new FormClosedEventHandler(ejecucion_FormClosed);
            ejecucion.Show();
        }

        private void ejecucion_FormClosed(object sender, FormClosedEventArgs e)
        {
            ejecucionTrabajo = frmDetalles.pasarDetalle();
        }

        private void btnFormaPago_Click(object sender, EventArgs e)
        {
            frmDetalles forma = new frmDetalles();
            forma.cargarDetalle(formaPago);
            forma.FormClosed += new FormClosedEventHandler(forma_FormClosed);
            forma.Show();
        }

        private void forma_FormClosed(object sender, FormClosedEventArgs e)
        {
            formaPago = frmDetalles.pasarDetalle();
        }

        private void btnAlta_Click(object sender, EventArgs e)
        {
            try
            {
                if (verificar())
                {
                    //cargar presupuesto
                    presupuestosDTO p = new presupuestosDTO();
                    p.Activo = true;
                    if (null != datosProForma)
                    {
                        p.Cif = Convert.ToDouble(datosProForma[0]);
                        p.CodFactura = datosProForma[2];
                        p.Fob = Convert.ToDouble(datosProForma[1]);
                    }
                    else
                    {
                        p.Cif = 0;
                        p.CodFactura = "";
                        p.Fob = 0;
                    }
                    p.Codigo = txtCodigo.Text;
                    p.CondicionesGenerales = condicionesGenerales;
                    p.EjecucionTrabajo = ejecucionTrabajo;
                    p.EsProforma = esProForma;
                    p.Estado = cmbEstado.Text;
                    p.Fecha = Convert.ToDateTime(dtpFecha.Text);
                    p.FormaPago = formaPago;
                    p.PlazoEntrega = plazoEntrega;
                    p.Precio = Convert.ToDouble(txtPrecio.Text);
                    p.TipoPresupuesto = tipo;
                    //modificar presupuesto
                    Boolean modificarPresupuesto = createPresupuesto.updatePresupuesto(p, txtBusqueda.Text);
                    if (modificarPresupuesto)
                    {
                        //modificar presupuesto cliente
                        DataTable clientes = createCliente.getAllClientes();
                        presupuestosClientesDTO pc = new presupuestosClientesDTO();
                        pc.CodigoPresupuesto = txtCodigo.Text;
                        pc.NombreCliente = clientes.Select("id = " + idCliente)[0]["Nombre"].ToString();
                        pc.ID = createPresupuestoCliente.getPresupuestoCliente(txtBusqueda.Text).ID;
                        Boolean modificarPresupuestoCliente = createPresupuestoCliente.updatePresupuestoCliente(pc);
                        if (modificarPresupuestoCliente)
                        {
                            //modificar presupuesto mantenimiento
                            presupuestoMantenimientoDTO pm = new presupuestoMantenimientoDTO();
                            pm.CodigoPresupuesto = txtCodigo.Text;
                            pm.Tarea = tareas;
                            List<string> descripcion = new List<string>();

                            foreach (string tarea in tareas)
                            {
                                mantenimientoDTO m = createMantenimiento.getMantenimiento(tarea);
                                descripcion.Add(m.Descripcion);
                            }

                            pm.DescripcionTarea = descripcion;

                            Boolean modificarPresupuestoMantenimiento = createPresupuestoMantenimiento.updatePresupuestoMantenimiento(pm, idPresupuesto, tareasAnteriores);

                            if (modificarPresupuesto && modificarPresupuestoCliente && modificarPresupuestoMantenimiento)
                            {
                                MessageBox.Show("Presupuesto Modificado", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);

                                //elimina el archivo anterior
                                Herramientas.eliminarArchivo(rutaVieja);
                                //exporta el modificado
                                string ruta = @"C:\Presupuestos\" + p.Fecha.Year + @"\" + pc.NombreCliente + @"\" + p.Codigo + ".docx";
                                ExportarMantenimiento.exportar(pm, pc, p, ruta);
                                //envio de mail
                                envioDeMail(cmbEstado.Text, ruta, txtCodigo.Text);

                                this.Close();
                                this.Dispose();
                            }
                            else
                            {
                                MessageBox.Show("Error al intentar Modificar!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                Texto.escribirLog("Error en modificarPresupuestoMantenimiento");
                            }
                        }
                        else
                        {
                            Texto.escribirLog("Error en modificarPresupuestoCliente");
                        }

                    }
                    else
                    {
                        Texto.escribirLog("Error en modificarPresupuesto");
                    }

                }
            }
            catch (Exception ex)
            {
                Texto.escribirLog(ex.Message);
            }
            
            }

        private bool verificar()
        {
            bool verificado = false;
            bool tipoCorrecto = false;
            bool proFormaCorrecta = false;
            bool clienteCorrecto = false;
            bool precioCorrecto = false;
            bool fechaCorrecto = false;
            bool estadoCorrecto = false;
            bool condCorrecta = false;
            bool ejeCorrecta = false;
            bool formaCorrecta = false;
            bool plazoCorrecto = false;

            if (idCliente == 0)
            {
                errorProvider1.SetError(btnCliente, "Cargar Cliente");
            }
            else
            {
                errorProvider1.SetError(btnCliente, string.Empty);
                clienteCorrecto = true;
            }

            if (!Validador.es_decimal(txtPrecio))
            {
                errorProvider1.SetError(txtPrecio, "Formato ##.##");
            }
            else
            {
                errorProvider1.SetError(txtPrecio, string.Empty);
                precioCorrecto = true;
            }

            if (dtpFecha.Text.Equals(""))
            {
                errorProvider1.SetError(dtpFecha, "No puede estar vacio");
            }
            else
            {
                errorProvider1.SetError(dtpFecha, string.Empty);
                fechaCorrecto = true;
            }

            if (!Validador.es_cadena(cmbEstado) || cmbEstado.Text.Trim().Equals(""))
            {
                errorProvider1.SetError(cmbEstado, "Sólo Letras");
            }
            else
            {
                errorProvider1.SetError(cmbEstado, string.Empty);
                estadoCorrecto = true;
            }

            if (rdProForma.Checked)
            {
                if (datosProForma.Equals(""))
                {
                    errorProvider1.SetError(rdProForma, "Cargar Datos");
                }
                else
                {
                    errorProvider1.SetError(rdProForma, string.Empty);
                    proFormaCorrecta = true;
                }
            }
            else
            {
                proFormaCorrecta = true;
            }

            if (null == tareas)
            {
                errorProvider1.SetError(btnTipo, "Cargar Equipo");
            }
            else
            {
                errorProvider1.SetError(btnTipo, string.Empty);
                tipoCorrecto = true;
            }

            if (condicionesGenerales.Equals(""))
            {
                errorProvider1.SetError(btnCondiciones, "Cargar Datos");
            }
            else
            {
                errorProvider1.SetError(btnCondiciones, string.Empty);
                condCorrecta = true;
            }

            if (formaPago.Equals(""))
            {
                errorProvider1.SetError(btnFormaPago, "Cargar Datos");
            }
            else
            {
                errorProvider1.SetError(btnFormaPago, string.Empty);
                formaCorrecta = true;
            }

            if (ejecucionTrabajo.Equals(""))
            {
                errorProvider1.SetError(btnEjecucion, "Cargar Datos");
            }
            else
            {
                errorProvider1.SetError(btnEjecucion, string.Empty);
                ejeCorrecta = true;
            }

            if (plazoEntrega.Equals(""))
            {
                errorProvider1.SetError(btnPlazo, "Cargar Datos");
            }
            else
            {
                errorProvider1.SetError(btnPlazo, string.Empty);
                plazoCorrecto = true;
            }

            if (tipoCorrecto && proFormaCorrecta && clienteCorrecto
                && precioCorrecto && fechaCorrecto && estadoCorrecto
                && condCorrecta && ejeCorrecta && formaCorrecta && plazoCorrecto)
            {
                verificado = true;
            }

            return verificado;

        }

        private void btnTipo_Click(object sender, EventArgs e)
        {
            frmTareas tarea = new frmTareas();
            tarea.cargarTareas(tareas);
            tarea.FormClosed += new FormClosedEventHandler(tarea_FormClosed);
            tarea.Show();
        }

        private void tarea_FormClosed(object sender, FormClosedEventArgs e)
        {
            tareas = frmTareas.pasarTareas();
        }

        private void btnCliente_Click(object sender, EventArgs e)
        {
            frmClientes cliente = new frmClientes();
            cliente.cargarId(idCliente);
            cliente.FormClosed += new FormClosedEventHandler(cliente_FormClosed);
            cliente.Show();
        }

        private void cliente_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                idCliente = frmClientes.pasarId();
                DataTable c = createCliente.getAllClientes();
                string nombre = c.Select("id = " + idCliente)[0]["Nombre"].ToString();

                string[] codigo = txtCodigo.Text.Split('-');
                string id = codigo[0].Trim();

                //codigo reformado
                txtCodigo.Text = id + "-" + nombre + "-Mantenimiento";
            }
            catch (Exception ex)
            {
                Texto.escribirLog(ex.Message);
            }
            
        }

        private void btnPlazo_Click(object sender, EventArgs e)
        {
            frmDetalles plazo = new frmDetalles();
            plazo.cargarDetalle(plazoEntrega);
            plazo.FormClosed += new FormClosedEventHandler(plazo_FormClosed);
            plazo.Show();
        }

        private void plazo_FormClosed(object sender, FormClosedEventArgs e)
        {
            plazoEntrega = frmDetalles.pasarDetalle();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            frmPresupuestosMan preMan = new frmPresupuestosMan();
            preMan.FormClosed += new FormClosedEventHandler(preMan_FormClosed);
            preMan.Show();
        }

        private void preMan_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (!frmPresupuestosMan.pasarCodigo().Equals(""))
            {
                txtBusqueda.Text = frmPresupuestosMan.pasarCodigo();
            }
        }

        private void txtBusqueda_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(txtBusqueda.Text.Trim()))
                {
                    txtCodigo.Text = "";
                    txtPrecio.Text = "";
                    cmbEstado.Text = "";
                    rdProForma.Checked = false;
                    return;
                }

                presupuestoMantenimientoDTO pm = createPresupuestoMantenimiento.getPresupuestoMantenimiento(txtBusqueda.Text);
                presupuestosClientesDTO pc = createPresupuestoCliente.getPresupuestoCliente(txtBusqueda.Text);
                presupuestosDTO p = createPresupuesto.getPresupuesto(txtBusqueda.Text);

                if (null != pm.DescripcionTarea || null != pc.CodigoPresupuesto || null != p.Codigo)
                {
                    txtCodigo.Text = pm.CodigoPresupuesto;
                    txtPrecio.Text = pm.Precio.ToString();
                    dtpFecha.Text = pm.Fecha.ToString();
                    cmbEstado.Text = pm.EstadoPresupuesto;
                    if (p.EsProforma)
                    {
                        rdProForma.Checked = true;
                        esProForma = true;
                    }
                    idPresupuesto = p.ID;
                    idCliente = Convert.ToInt16(createCliente.getCliente(pc.NombreCliente).ID);
                    tareas = pm.Tarea;
                    tareasAnteriores = pm.Tarea;
                    if (!p.CodFactura.Equals(""))
                    {
                        datosProForma = new string[3];
                        datosProForma[0] = p.Cif.ToString();
                        datosProForma[1] = p.Fob.ToString();
                        datosProForma[2] = p.CodFactura;
                    }

                    formaPago = p.FormaPago;
                    condicionesGenerales = p.CondicionesGenerales;
                    ejecucionTrabajo = p.EjecucionTrabajo;
                    plazoEntrega = p.PlazoEntrega;

                    rutaVieja = @"C:\Presupuestos\" + p.Fecha.Year + @"\" + pc.NombreCliente + @"\" + p.Codigo + ".docx";
                }
                else
                {
                    txtCodigo.Text = "";
                    txtPrecio.Text = "";
                    cmbEstado.Text = "";
                    rdProForma.Checked = false;
                }
            }
            catch (Exception ex)
            {

                txtCodigo.Text = "";
                txtPrecio.Text = "";
                cmbEstado.Text = "";
                rdProForma.Checked = false;
                Texto.escribirLog(ex.Message);
                return;
            }
        }

        private void envioDeMail(string estado, string ruta, string codigo)
        {
            if (estado.Equals("Aprobado"))
            {
                DialogResult resp = MessageBox.Show("¿Desea enviar el Aviso de Aprobación del Presupuesto?", "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (resp.Equals(DialogResult.Yes))
                {
                    frmMail mail = new frmMail();
                    string usuario = frmPrincipal.pasarUsuario();
                    mail.cargarDatos(usuario, "Aprobación", "", codigo);
                    mail.Show();
                }
                else
                {
                    DialogResult re = MessageBox.Show("¿Desea enviar el Presupuesto al Cliente?", "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (re.Equals(DialogResult.Yes))
                    {
                        frmMail mail = new frmMail();
                        string usuario = frmPrincipal.pasarUsuario();
                        mail.cargarDatos(usuario, "Envío de Presupuesto", ruta, codigo);
                        mail.Show();
                    }
                }
            }

        }

    }
}
